package com.hskj.verificationcode.controller;


import com.hskj.verificationcode.util.CodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Duration;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;


@RestController
public class CodeController {

    @Autowired
    RedisTemplate redisTemplate;


    /**
     * 检验验证码是否正确
     *
     * @param phone_no
     * @param verify_code
     * @return
     */
    @RequestMapping("/checkCode")
    public Map<String, Object> checkCodeServlet(String phone_no, String verify_code) {
        Map<String, Object> map = new HashMap<>();
        // 判断手机号和输入的验证码是否为空
        if (phone_no == null || "".equals(phone_no) || verify_code == null || "".equals(verify_code)) {
            map.put("success", false);
            return map;
        }

        //定义key
        String CODE_KEY = phone_no + ":" + verify_code;

        // 获取redis中的验证码
        String redisCode = (String) redisTemplate.opsForValue().get(CODE_KEY);

        if (redisCode == null) {
            map.put("success", false);
            return map;
        }

        // 判断redis中的和输入的验证码是否一样
        if (redisCode.equals(verify_code)) {
            // 删除验证码
            redisTemplate.delete(CODE_KEY);
            map.put("success", true);
            return map;
        }
        return map;
    }


    /**
     * 根据手机号生成发送验证码,并存储到redis中
     *
     * @param phone_no
     * @return
     */
    @RequestMapping("/sendCode")
    public Map<String, Object> sendCodeServlet(String phone_no) {

        //System.out.println(phone_no);

        Map<String, Object> map = new HashMap<>();

        //判断是否为空
        if (phone_no == null || "".equals(phone_no)) {
            map.put("success", false);
            return map;
        }

        // 生成验证码
        String randomCode = CodeUtil.generateVerifyCode(4);
        System.out.println("randomCode = " + randomCode);
        //定义key
        String CODE_KEY = phone_no + ":" + randomCode;

        //定义次数的key
        String countkey = phone_no;

        //获取发送验证码的次数
        Integer countKey = (Integer) redisTemplate.opsForValue().get(countkey);

        if (countKey == null) {
            // 证明是第一次发送，把当天剩余的秒数设置到redis中
            // 获取当天剩余时间
            long theLeftSeconds = getTheLeftSeconds();
            redisTemplate.opsForValue().set(countkey,1,(int)theLeftSeconds,TimeUnit.SECONDS);
        }else if(countKey == 3){
            //说明今天的次数已经用完了
            //前台  单日发送超过次数  处修改   data.limit=="limit"
            map.put("limit", "limit");
            return map;
        } else{
            //也不是第一次也没有超过三次,发送一次验证码加一次
            redisTemplate.opsForValue().increment(countkey);
        }

        // 将验证码存储到redis中,并设置过期时间2分钟
        redisTemplate.opsForValue().set(CODE_KEY, randomCode, 2, TimeUnit.MINUTES);

        map.put("success", true);
        return map;
    }

    //获取当天剩余秒数的方法
    private long getTheLeftSeconds() {
        //获取现在的时间
        LocalTime now = LocalTime.now();
        //获取当日23点59分59秒的时间
        LocalTime end = LocalTime.of(23, 59, 59);
        //获取end与now相差的秒数
        long millis = Duration.between(now, end).toMillis() / 1000;
        return millis;
    }
}

